package com.itcz.generator;


import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ArrayUtil;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;


public class StaticGenerator {
    public static void main(String[] args) {
        // 获取项目根目录
        String projectPath = System.getProperty("user.dir");
        String parentPath = new File(projectPath).getParent();
        // 输入路径:ACM 示例代码模板目录
        String inputPath = parentPath + File.separator + File.separator + "demo-template" + File.separator + "acm-template";
        // 输出路径:直接输出到项目的根目录
        String outputPath = projectPath;
        // 复制
        // copyFilesByHutool(inputPath, outputPath);
        // 使用自定义方法复制文件
        copyFilesByRecursive(inputPath, outputPath);
    }


    /**
     * 拷贝文件(Hutool 实现，会将输入目录完整拷贝到输出目录下）
     * @param inputPath 输入路径
     * @param outputPath 输出路径
     */
    public static  void copyFilesByHutool(String inputPath, String outputPath) {
        // hutool第三方插件提供的工具类
        FileUtil.copy(inputPath, outputPath, false);
    }


    /**
     * 递归拷贝文件（递归实现，会将输入目录完整拷贝到输出目录）
     * @param inputPath 输入路径
     * @param outputPath 输出路径
     */
    public static void copyFilesByRecursive(String inputPath, String outputPath) {
        // 根据地址创建文件对象
        File inputFile = new File(inputPath);
        File outputFile = new File(outputPath);
        try {
            // 递归拷贝文件
            copyFileByRecursive(inputFile, outputFile);
        } catch (Exception e) {
            System.out.println("复制失败");
            throw new RuntimeException(e);
        }
    }


    /**
     * 文件 A => 目录 B，则文件 A 放在目录 B 下
     * 文件 A => 文件 B，则文件 A 覆盖文件 B
     * 目录 A => 目录 B，则目录 A 放在目录 B 下
     * 核心思路：先创建目录，然后遍历目录内的文件，依次复制
     * @param inputFile 输入路径
     * @param outputFile 输出路径
     * @throws IOException IO异常
     */
    private static void copyFileByRecursive(File inputFile, File outputFile) throws IOException {
        // 区分是文件还是目录
        if(inputFile.isDirectory()) {
            System.out.println(inputFile.getName());
            // 根据输出地址创建文件对象
            File destOutputFile = new File(outputFile, inputFile.getName());
            // 如果是目录的话，首先创建目录
            if(!destOutputFile.exists()) {
                destOutputFile.mkdirs();
            }
            // 获取输入路径的目录下所有的子文件和子目录
            File[] files = inputFile.listFiles();
            // 如果没有子文件和子目录，则直接结束(运用hutool工具类实现）
            if(ArrayUtil.isEmpty(files)) {
                return;
            }
            // 递归拷贝文件
            for(File file : files) {
                copyFileByRecursive(file, destOutputFile);
            }
        } else {
            // 是文件，直接复制到目标地址下
            Path destPath = outputFile.toPath().resolve(inputFile.getName());
            Files.copy(inputFile.toPath(), destPath, StandardCopyOption.REPLACE_EXISTING);
        }
    }
}
